<?php

namespace app\common\service;

use app\common\controller\Send;
use think\facade\Log;
use app\api\service\WechatAuth;
use think\facade\Env;
class File
{
    use Send;

    // 文件上传格式
//    public $format = 'gif,png,jpeg,jpg,swf';
    // 文件大小限制
    public $maxUploadSize = 10 * 1024 * 1024;

    public function __construct($fileSize = 0)
    {
        if ($fileSize > 0) {
            $this->maxUploadSize = $fileSize;
        }
    }

    /**
     * 上传表单文件
     * @param string $dir 上传的目录
     * @param int $type 文件类型，默认图片
     * @return array
     */
    public function formFile($dir, $type = 1)
    {
        if (!isset($_FILES['file'])) {
            return self::sendResult(100, [], '请上传文件');
        }

        $file = $_FILES['file'];

        if ($file['error'] != UPLOAD_ERR_OK) {
            return self::sendResult(130, [], '上传文件错误：' . $this->fileUploadError($_FILES['file']['error']));
        }

        // 文件大小
        $fileSize = $this->maxUploadSize;
        if ($fileSize > 0 && $file['size'] > $fileSize) {
            return self::sendResult(131, [], '文件大小不能超过' . self::getRealSize($fileSize));
        }

        // 根据文件类型获取上传文件格式限制
        $format = $this->getFormat($type);

        // 上传的文件格式
        $extension = get_extension($file['name']);
        $formatArr = array_flip(explode(',', $format));
        // 文件格式转为小写
        $extension = strtolower($extension);
        if (!isset($formatArr[$extension])) {
            return self::sendResult(132, [], '请上传' . $format . '格式的文件');
        }

        // 要保存的文件路径和名称
        $object = get_filename($dir, $extension);


        if(checkMiniprogram() ){
            $config = config('wx_mini');
            $auth = new WechatAuth($config['app_id'],$config['app_secret']);
            $token = $auth->getAccessToken("client",null);
            //检测文本是否合法
            $dat = $auth->checkImageSecure($file['tmp_name']);
            if($dat['errcode'] != 0){
                return self::sendResult(132, [], $dat['errcode']."含有非法信息，请重新上传");
            }
        }
        

        // 上传到阿里云oss
        $oss = new Oss();
        $return = $oss->upload($object, $file['tmp_name']);

        // 上传成功返回路径
        if ($return['code'] == self::$okCode) {
            $return['data']['url'] = config('file_prefix') . $object;
            $return['data']['urlRoot'] = $object;
            $return['data']['size'] = $file['size'];
        }


        return self::sendResult($return['code'], $return['data'], $return['msg']);
    }


    


    /**
     * 上传文件报错
     * @param $code
     * @return mixed|string
     */
    public function fileUploadError($code)
    {
        $errors = [
            0 => '文件上传成功',
            1 => '上传的文件超过了限制',
            2 => '上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值',
            3 => '文件只有部分被上传',
            4 => '没有文件被上传',
            6 => '找不到临时文件夹',
            7 => '文件写入失败',
            8 => 'A PHP extension stopped the file upload.',
        ];
        return isset($errors[$code]) ? $errors[$code] : '上传出错';
    }

    /**
     * 根据类型获取文件格式限制
     * @param $type
     * @return mixed|string
     */
    public function getFormat($type)
    {
        $list = [
            1 => 'gif,png,jpeg,jpg',
            2 => 'mp3,mp4,wma,avi,rm,rmvb,flv,mpg,mov,mkv,ogv',
            3 => 'zip,rar,pdf,doc,xls,xlsx'
        ];
        return isset($list[$type]) ? $list[$type] : '';
    }

    /**
     * 单位自动转换函数.
     * @param string $size 大小
     * @return string
     */
    public function getRealSize($size)
    {
        $kb = 1024;         // Kilobyte
        $mb = 1024 * $kb;   // Megabyte
        $gb = 1024 * $mb;   // Gigabyte
        $tb = 1024 * $gb;   // Terabyte

        if ($size < $kb) {
            return $size . " B";
        } else if ($size < $mb) {
            return round($size / $kb, 2) . " KB";
        } else if ($size < $gb) {
            return round($size / $mb, 2) . " MB";
        } else if ($size < $tb) {
            return round($size / $gb, 2) . " GB";
        } else {
            return round($size / $tb, 2) . " TB";
        }
    }
}